win32: Make grab cursors work again
authorAlexander Larsson <alexl@redhat.com>
Thu, 10 Nov 2011 20:32:50 +0000 (21:32 +0100)
committerAlexander Larsson <alexl@redhat.com>
Thu, 10 Nov 2011 20:32:50 +0000 (21:32 +0100)
gdk/win32/gdkdevice-win32.c
gdk/win32/gdkevents-win32.c
gdk/win32/gdkprivate-win32.h

index 09ec36a15043dc2a9de99676ad950626dea89e92..93fc5198f8d8560867c449c9c7565ab9255dd367 100644 (file)
@@ -318,8 +318,37 @@ gdk_device_win32_grab (GdkDevice    *device,
                        GdkCursor    *cursor,
                        guint32       time_)
 {
+  GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
+  HCURSOR hcursor;
+  GdkWin32Cursor *cursor_private;
+
+  cursor_private = (GdkWin32Cursor*) cursor;
+
   if (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD)
-    SetCapture (GDK_WINDOW_HWND (window));
+    {
+      if (!cursor)
+       hcursor = NULL;
+      else if ((hcursor = CopyCursor (cursor_private->hcursor)) == NULL)
+       WIN32_API_FAILED ("CopyCursor");
+
+      if (_gdk_win32_grab_cursor != NULL)
+       {
+         if (GetCursor () == _gdk_win32_grab_cursor)
+           SetCursor (NULL);
+         DestroyCursor (_gdk_win32_grab_cursor);
+       }
+
+      _gdk_win32_grab_cursor = hcursor;
+
+      if (_gdk_win32_grab_cursor != NULL)
+       SetCursor (_gdk_win32_grab_cursor);
+      else if (impl->hcursor != NULL)
+       SetCursor (impl->hcursor);
+      else
+       SetCursor (LoadCursor (NULL, IDC_ARROW));
+
+      SetCapture (GDK_WINDOW_HWND (window));
+    }
 
   return GDK_GRAB_SUCCESS;
 }
@@ -338,7 +367,17 @@ gdk_device_win32_ungrab (GdkDevice *device,
     info->serial_end = 0;
 
   if (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD)
-    ReleaseCapture ();
+    {
+      if (_gdk_win32_grab_cursor != NULL)
+       {
+         if (GetCursor () == _gdk_win32_grab_cursor)
+           SetCursor (NULL);
+         DestroyCursor (_gdk_win32_grab_cursor);
+       }
+      _gdk_win32_grab_cursor = NULL;
+
+      ReleaseCapture ();
+    }
 
   _gdk_display_device_grab_update (display, device, NULL, 0);
 }
index 2627e796354471f5c2e703f9d6ea6a6c632ad580..6fc6f582161c033df0c2d712fcf76aa7ca212b5a 100644 (file)
@@ -112,7 +112,7 @@ static gboolean gdk_event_dispatch (GSource     *source,
 static GList *client_filters;  /* Filters for client messages */
 extern gint       _gdk_input_ignore_core;
 
-static HCURSOR p_grab_cursor;
+HCURSOR _gdk_win32_grab_cursor;
 
 static GSourceFuncs event_funcs = {
   gdk_event_prepare,
@@ -445,60 +445,6 @@ event_mask_string (GdkEventMask mask)
 
 #endif
 
-GdkGrabStatus
-_gdk_windowing_device_grab (GdkDevice    *device,
-                            GdkWindow    *window,
-                            GdkWindow    *native_window,
-                            gboolean      owner_events,
-                            GdkEventMask       event_mask,
-                            GdkWindow    *confine_to,
-                            GdkCursor    *cursor,
-                            guint32          time)
-{
-  HCURSOR hcursor;
-  GdkWin32Cursor *cursor_private;
-  gint return_val;
-  GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (native_window->impl);
-
-  g_return_val_if_fail (window != NULL, 0);
-  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
-  g_return_val_if_fail (confine_to == NULL || GDK_IS_WINDOW (confine_to), 0);
-  
-  cursor_private = (GdkWin32Cursor*) cursor;
-  
-  if (!cursor)
-    hcursor = NULL;
-  else if ((hcursor = CopyCursor (cursor_private->hcursor)) == NULL)
-    WIN32_API_FAILED ("CopyCursor");
-
-  return_val = GDK_DEVICE_GET_CLASS (device)->grab (device,
-                                                    native_window,
-                                                    owner_events,
-                                                    event_mask,
-                                                    confine_to,
-                                                    cursor,
-                                                    time);
-
-  /* TODO_CSW: grab brokens, confine window, input_grab */
-  if (p_grab_cursor != NULL)
-    {
-      if (GetCursor () == p_grab_cursor)
-        SetCursor (NULL);
-      DestroyCursor (p_grab_cursor);
-    }
-
-  p_grab_cursor = hcursor;
-
-  if (p_grab_cursor != NULL)
-    SetCursor (p_grab_cursor);
-  else if (impl->hcursor != NULL)
-    SetCursor (impl->hcursor);
-  else
-    SetCursor (LoadCursor (NULL, IDC_ARROW));
-
-  return return_val;
-}
-
 static GdkWindow *
 find_window_for_mouse_event (GdkWindow* reported_window,
                             MSG*       msg)
@@ -2682,8 +2628,8 @@ gdk_event_translate (MSG  *msg,
       if (grab_window == NULL && LOWORD (msg->lParam) != HTCLIENT)
        break;
 
-      if (grab_window != NULL && p_grab_cursor != NULL)
-       hcursor = p_grab_cursor;
+      if (grab_window != NULL && _gdk_win32_grab_cursor != NULL)
+       hcursor = _gdk_win32_grab_cursor;
       else if (!GDK_WINDOW_DESTROYED (window))
        hcursor = GDK_WINDOW_IMPL_WIN32 (window->impl)->hcursor;
       else
index c039c9ef3965a64e52f04392217120a514785f42..c9625cb43c6b699f9cc06b8a8da1cffa6c4848c3 100644 (file)
@@ -356,6 +356,8 @@ extern GHashTable   *_format_atom_table;
 /* Hold the result of a delayed rendering */
 extern HGLOBAL         _delayed_rendering_data;
 
+extern HCURSOR _gdk_win32_grab_cursor;
+
 HGLOBAL _gdk_win32_selection_convert_to_dib (HGLOBAL  hdata,
                                             GdkAtom  target);